// 导入校验工具包
import Schema from 'validate'
// 创建校验规则
// new Schema({ obj }, { options })有2个参数, 第一个位校验对象, 第二个位配置对象,
// 默认情况下,所有未在模式中定义的值都将从对象中剥离,我们需要在配置对象里面设置strip=false来禁用此行为
const roomInfo = new Schema(
  {
    //小区信息
    point: {
      type: String, //类型
      required: true, //必填
      message: '小区名不能为空', //提示信息
    },
    //小区楼栋信息
    building: {
      type: String, //类型
      required: true, //必填
      message: '小区楼栋名不能为空', //提示信息
    },
    //小区房间信息
    room: {
      type: String, //类型
      required: true, //必填
      message: '小区房间名不能为空', //提示信息
    },
    //业主姓名
    name: {
      type: String, //类型
      required: true, //必填
      match: /^[\u4e00-\u9fa5]{2,6}$/, //中文校验-2-6个字符,
      message: '请输入2-6位中文字符', //提示信息
    },
    //业主电话
    mobile: {
      type: String, //类型
      required: true, //必填
      match: /^1[3-9]\d{9}$/, //手机号码校验11数字
      message: '请输入正确的手机号', //提示信息
    },
    // 身份证正面
    idcardFrontUrl: {
      type: String, //类型
      required: true, //必填
      message: '身份证正面不能为空', //提示信息
    },
    // 身份证背面
    idcardBackUrl: {
      type: String, //类型
      required: true, //必填
      message: '身份证背面不能为空', //提示信息
    },
  },
  //第二个对象是配置对象
  {
    strip: false, //禁用validate的默认剥离未定义校验规则元素行为
  }
)

Page({
  data: {
    // 小区楼栋信息
    building: '',
    // 业主性别0女1男
    gender: 0, //接口需要Number型
    // 身份证背面
    idcardBackUrl: '',
    // 身份证正面
    idcardFrontUrl: '',
    //  业主电话
    mobile: '',
    // 业主姓名
    name: '',
    // 小区信息
    point: '',
    //  小区房间信息
    room: '',
  },
  async onLoad({ point, building, room, id }) {
    console.log(`小区-楼栋-房间号 ${point}-${building}-${room}`)
    console.log('id  ----->  ', id)
    if (id) {
      //编辑页面
      //查询房屋详情进行回填
      wx.setNavigationBarTitle({ title: '编辑房屋信息' })
      const res = await wx.http({
        url: `/room/${id}`,
      })
      console.log('res  ----->  ', res)
      // 拿回来的数据多了个status,所以我们需要去掉
      const { status, ...data } = res.data
      console.log('data  ----->  ', data)
      //设置回data里面进行一个回填
      this.setData(data)
    } else {
      wx.setNavigationBarTitle({ title: '添加房屋信息' })
      // 新增页面
      this.setData({
        point, //小区信息
        building, //小区楼栋信息
        room, //小区房间信息
      })
    }
  },
  goList() {
    wx.reLaunch({
      url: '/house_pkg/pages/list/index',
    })
  },
  //上传图片
  // wx.chooseMedia(Object object) 以 Promise 风格 调用：支持  功能描述：拍摄或从手机相册中选择图片或视频。
  async chooseImage(e) {
    //小程序中获取自定义属性有2种方式
    // 1.在标签上设置data-type="idcardFrontUrl || idcardBackUrl" ,通过e.target.dataset.type获取
    // 2.在标签上设置mark:type="idcardFrontUrl || idcardBackUrl",通过e.target.dataset.type获取
    // console.log('e  ----->  ', e)
    // console.log('e.target.dataset.type', e.target.dataset.type)
    // console.log('e.target.dataset.type类型', typeof e.target.dataset.type)

    // console.log('e.mark.type  ----->  ', e.mark.type)
    // console.log('e.mark.type类型  ----->  ', typeof e.mark.type)
    const res = await wx.chooseMedia({
      count: 1, //默认值可以上传9张,改为只能上传1张
      mediaType: ['image'], //上传图片类型
    })
    // console.log('res  ----->  ', res)
    // 通过选择图片api获取到临时地址
    const imageUrl = res.tempFiles[0].tempFilePath
    // console.log('  imageUrl----->  ', imageUrl)
    // console.log(' getApp().token ----->  ', getApp().token)
    // 把临时图片上传到服务器获取到远程地址
    // wx.uploadFile(Object object) 以 Promise 风格 调用：不支持 将本地资源上传到服务器可以返回一个在线地址
    wx.uploadFile({
      url: wx.http.baseURL + '/upload', //由于wx.http和wx.uploadFile是2个不同的api,我们的基准路径只配了wx.http的所以这里需要重新配置
      filePath: imageUrl, //要上传文件资源的路径(本地地址||临时地址)
      name: 'file', //文件对应的key，开发者在服务端可以通过这个key获取文件的二进制内容,看接口得知-上传的文件二进制为file
      // 由于没有设置请求头带上token，所以发请求的时候会出现401,所以我们需要设置上请求头根据接口文档来设置
      header: {
        Authorization: `Bearer ${getApp().token}`,
      },
      success: (result) => {
        // console.log('接口上传成功的回调  ----->  ', result)
        // 由于返回的数据是JSON字符串,所以我们需要转换为JSON对象
        // JSON.parse(JSON字符串)将JSON字符串转换为对象
        const data = JSON.parse(result.data)
        // console.log('data  ----->  ', data)
        // console.log(typeof data)
        const onlineUrl = data.data.url
        // console.log('  在线地址----->  ', onlineUrl)
        // 把获取到的data存到在线地址里面去
        const type = e.mark.type //'idcardFrontUrl' || 'idcardBackUrl'
        // console.log('type  ----->  ', type)
        // 给获取到的在线地址设置到data里面
        this.setData({
          // 对象[变量]:属性值 给对象添加属性
          [type]: onlineUrl,
        })
      },
      fail: (err) => {
        console.log('文件上传失败的回调  ----->  ', err)
      },
    })
  },
  //提交审核事件
  async onSubmit() {
    /* 
    1 获取到所有的表单数据 
    2 表单的合法性验证 （validate.js 库）
      1 小区、楼栋、房间号、身份证正房间  非空即可 
      2 姓名 中文-[2-6]  手机号码-
    3 验证通过 调用接口 完成 新增房屋的功能！！ 
     */

    // 假设有id
    const { id, building, gender, idcardFrontUrl, idcardBackUrl, mobile, name, point, room } = this.data

    //准备对象数据做校验
    const data = { id, building, gender, idcardFrontUrl, idcardBackUrl, mobile, name, point, room }
    // console.log(' 校验前的data----->  ', data)

    //开始校验
    // const errors = 校验规则名.validate(obj) 校验规则传入一个对象
    const errors = roomInfo.validate(data)
    // 校验规则提示默认按照写的校验规则顺序来提示,所以我们写校验规则的时候应该从上到下写校验规则
    // console.log('errors  ----->  ', errors)
    // 如果数组有长度,代表有错误
    if (errors.length) {
      //提示用户错误信息,利用封装的消息组件
      wx.utils.toast(errors[0].message)
      // 切记需要退出函数,下面代表不再执行
      return
    }
    // console.log('校验通过,可以发起提交请求  ----->  ')
    // console.log(' 校验后的data ----->  ', data)
    // 在这里我们可以发现,校验后的数据缺少了gender字段,这是因为validate的特性：默认情况下,所有未在模式中定义的值都将从对象中剥离
    // 可以通过在options对象上设置.strip(去除) = false以禁止此行为,在未来的版本中可能会改变这一点

    if (id === undefined) {
      // 如果id为undefined代表是新增,data对象删掉id
      delete data.id
    }
    console.log('data  ----->  ', data)

    // 如果有id为编辑,没id为新增调用同一个接口
    // 发送请求给后台
    const res = await wx.http({
      url: '/room',
      method: 'post',
      data,
    })
    // console.log(' 提交成功 ----->  ', res)
    // 判断是否成功
    if (res.code !== 10000) {
      // 不等于10000代表失败
      wx.utils.toast(res.message)
      return //退出函数,下面代码不再执行
    }
    // 提示用户
    if (id) {
      wx.showToast({ title: '编辑成功' })
    } else {
      wx.showToast({ title: '新增成功' })
    }

    // 跳转到房屋列表页面,使用延迟期跳转,否则提示看不到
    setTimeout(() => {
      // 注意最前面的路径要加/，只有页面配置pages数组里面不用加/
      wx.navigateTo({ url: '/house_pkg/pages/list/index' })
    }, 1000)
  },
  removePicture(e) {
    console.log('e  ----->  ', e)
    // 获取当前删除的是正面还是反面
    const { type } = e.mark //type为 "idcardFrontUrl"|| "idcardBackUrl"
    // 把data中对应的图片的url设置为空 实习删除功能
    this.setData({
      //将对应的图片地址清空即可实现删除功能
      // type是变量，只能用[type]包起来
      [type]: '',
    })
  },
})
